package reflection;

import pojo.User;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Test04 {
    public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException, NoSuchFieldException {
        final Class<User> userClass = User.class;

        final Constructor<User> declaredConstructor =
                userClass.getDeclaredConstructor(int.class, String.class, int.class);
        System.out.println("指定构造器：" + declaredConstructor);

        //使用构造器产生对象
        final User user = declaredConstructor.newInstance(1, "是我呀", 10);
        System.out.println(user);

        /**
         * 使用反射调用普通方法
         * invoke 激活
         * （执行对象， 方法参数）
         */
        final Method setName = userClass.getDeclaredMethod("setName", String.class);
        setName.invoke(user, "航少");
        System.out.println(user);

        /**
         * 使用反射调用属性。注：private修饰的属性不能直接修改
         * 那就将属性改成public吧
         */
        final Field name = userClass.getDeclaredField("name");
        //将此对象的可访问标志设置为指定的布尔值。
        // 值为true表示反射对象在使用时应抑制Java语言访问检查。如果值为false，则表示反射对象应强制执行Java语言访问检查。
        // 人话是：为true表示属性为public，为false表示属性为private
        name.setAccessible(true);
        name.set(user, "航仔");
        System.out.println(user);
    }
}
